/*
 * Clase que abre el archivo y lo lee para luego cargarlo en la matríz
 */
package Logic;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Ramiro
 */
public class LectorArchivoMLC {

    private File archivo = null;
    private FileReader fr = null;
    private BufferedReader br = null;
    private String ruta = "";
    //Datos para armar los vectores
    private int cantVectores = 0;
    private double index = 0;
    private int field = 0;
    private int group = 0;
    private int leaves = 0;
    private double leafTemp = 0;
    //Vector de vectores
    private Vector<VectorDatos> matriz;
    private String NombrePaciente = "";

    /*
     * Constructor al que se le pasa como parámetro la ruta del archivo.
     */
    public LectorArchivoMLC(String path) {
        this.ruta = path;
    }

    /*
     * Constructor
     */
    LectorArchivoMLC() {
        this.ruta = ".\\mlcfiles\\MLC.mlc";

    }

    /*
     * Abre el archivo y lo lee
     */
    public Vector<VectorDatos> AbrirArchivo() throws FileNotFoundException, IOException {
        String t = "";
        int fieldTemp = 0;
        Vector<Double> fila = new Vector<Double>();

        try {
            this.archivo = new File(ruta);
            this.fr = new FileReader(archivo);
            this.br = new BufferedReader(fr);
            // Lectura del fichero linea por linea
            String linea = "";
            while ((linea = br.readLine()) != null) {
                t = linea;
                if (linea.contains("First Name")) { //Guardo el apellido del paciente para el nombre de archivo
                    this.NombrePaciente = linea.substring((linea.indexOf("=") + 2), linea.length());
                }
                if (linea.contains("Number of Fields")) {
                    String f = linea.substring((linea.indexOf('=') + 2), linea.length());
                    this.cantVectores = Integer.parseInt(f) / 2;//Me fijo cuantas columnas va a tener la matriz
                    this.matriz = new Vector<VectorDatos>(cantVectores); //creo el vector de vectores
                }
                if (linea.contains("Number of Leaves")) {
                    String f = linea.substring((linea.indexOf('=') + 2), linea.length());
                    this.leaves = Integer.parseInt(f);
                }
                if (linea.contains("Field =")) {
                    String f = linea.substring((linea.indexOf('=') + 2), linea.length());//(linea.indexOf('=')+14)).trim();
                    fieldTemp = Integer.parseInt(f);
                    if (fieldTemp % 2 == 0) { //veo que sea un índice par
                        this.field = fieldTemp; //Lo almaceno solo si es par, sino lo dejo correr
                    }
                }
                if (linea.contains("Index =") && (this.field == fieldTemp)) {
                    String f = linea.substring((linea.indexOf('=') + 2), linea.length());
                    this.index = Double.valueOf(f);
                }
                if (linea.contains("Carriage Group =") && (this.field == fieldTemp)) {
                    String f = linea.substring((linea.indexOf('=') + 2), linea.length());
                    this.group = Integer.parseInt(f);
                }
                if (linea.contains("Leaf") && (this.field == fieldTemp)) {
                    String f = linea.substring((linea.indexOf('=') + 2), linea.length());
                    this.leafTemp = Double.valueOf(f.trim());

                    fila.add(leafTemp); //agrego el valor del leaf al vector

                    if (fila.size() == this.leaves) { //creo el VectorDatos para la matríz
                        VectorDatos vectorTemp = new VectorDatos(field, index, group, fila);
                        this.matriz.add(vectorTemp);//agrego el vector a la matriz
                        fila = new Vector<Double>(leaves);
                    }
                }

            }
        } catch (FileNotFoundException e) {
            throw e;
        } catch (IOException f) {
            throw f;
        } finally {
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return matriz;
    }

    public int numberOfFields() {
        return cantVectores;
    }

    public int numberOfLeaves() {
        return leaves;
    }

    public String getRuta() {
        return this.ruta;
    }

    public String getNombrePaciente() {
        return this.NombrePaciente;
    }
}
